package com.yang.strategy.flter.impl;

import com.yang.common.constant.CacheConstant;
import com.yang.common.model.StandardSubmit;
import com.yang.strategy.client.BeaconCacheClient;
import com.yang.strategy.flter.StrategyFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

import java.io.IOException;
import java.io.StringReader;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

/**
 * @author yangyongsheng
 * @date 2024/9/1 23:54
 * @description
 */
@Service(value = "dirtyword")
@Slf4j
public class DirtyWordStrategyFilter implements StrategyFilter {
    @Autowired
    private BeaconCacheClient cacheClient;

    @Override
    public void strategy(StandardSubmit submit) {
        log.info("【策略模块-敏感词校验】   校验ing…………");

        //1. 获取短信内容
        String text = submit.getText();

        //2.对短信内容进行分词，并且将分析内容存储到集合中
        Set<String> contentSet = new HashSet<>();
        //第一个参数为Reader，需要将String转成Reader,及要分词的内容
        //第二个参数false表示细粒度分词，true表示非细粒度
        IKSegmenter ik = new IKSegmenter(new StringReader(text),true);
        //ik.next就是进行一次分词，将这一次分词的结果封装在了Lexeme，为null时候代表分词结束。类似于IO流
        Lexeme lex = null;
        while (true){
            try {
                if ((lex = ik.next()) == null) break;//循环出口，小技巧:死循环先写出口
            } catch (IOException e) {
                log.info("【策略模块-敏感词校验】   IK分词器在处理短信内容时，出现异常 e = {}" ,e.getMessage());
            }
            //通过Lexeme获取这一次的分词结果
            contentSet.add(lex.getLexemeText());
        }

        //3.调用Cache缓存模块的交集方法，拿到结果
        Set<Object> dirtyWords = cacheClient.sinterStr(UUID.randomUUID().toString(), CacheConstant.DIRTY_WORD, contentSet.toArray(new String[]{}));
        //第一个key保证全局唯一，第二个key为敏感词的key

        //4. 根据返回的set集合，判断是否包含敏感词
        if (dirtyWords != null && dirtyWords.size() > 0){
            //5.如果有敏感词，抛出异常 / 其他操作。。
            log.info("【策略模块-敏感词校验】   短信内容包含敏感词信息， dirtyWords = {}",dirtyWords);
            // 还需要做其他处理
        }
    }
}
